﻿using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Globalization;
using System.Web.Mvc;
using System.Web.Security;

namespace File_Manager.Models
{
    /************************************************************************************************************/
    /**********************          DECLARACIÓN DEL MODELO CRECE Y TRIUNFA MÓDULO 3        *********************/
    /************************************************************************************************************/
    /*** Modelos Heredados:                                                                                   ***/
    /***                    Carga Problemarios: Problemario.dbo, Pregunta.dbo                                 ***/
    /***                    Respuesta Problemarios: Problemario_User_I.dbo, Respuesta.dbo                     ***/
    /***                    Reporte General: Problemario_User_I.dbo, Problemario_User_I.dbo                   ***/
    /***                                                                                                      ***/
    /************************************************************************************************************/
    public class CargaProblemario
    {
        public Problemario Problemario { get; set; }
        public Pregunta Pregunta { get; set; }

        public CargaProblemario()
        {
            this.Problemario = new Problemario();
            this.Pregunta = new Pregunta();
        }
    }

    public class RespuestaProblemario
    {
        public Problemario_User_I Problemario_User_I { get; set; }
        public Respuesta Respuesta { get; set; }

        public RespuestaProblemario()
        {
            this.Problemario_User_I = new Problemario_User_I();
            this.Respuesta = new Respuesta();
        }
    }

    public class ReporteGeneral
    {
        public List<Problemario_User_I> Problemario_User_I_Etapa_1 { get; set; }
        public List<Problemario_User_I> Problemario_User_I_Etapa_2 { get; set; }

        public ReporteGeneral()
        {
            this.Problemario_User_I_Etapa_1 = new List<Problemario_User_I>();
            this.Problemario_User_I_Etapa_2 = new List<Problemario_User_I>();
        }
    }
    /************************************************************************************************************/
    /**********************      FINAL DECLARACIÓN DEL MODELO CRECE Y TRIUNFA MÓDULO 3      *********************/
    /************************************************************************************************************/

    public class User_I
    {
        [Key]
        [Display(Name = "Nombre Usuario")]
        public string UserName { get; set; }

        [Display(Name = "Fecha Registro")]
        [DataType(DataType.Date)]
        public DateTime? registerDate { get; set; }

        [Required(ErrorMessage = "El Nombre es requerido")]
        [Display(Name = "Nombres")]
        public string name { get; set; }

        [Required(ErrorMessage = "El Apellido es requerido")]
        [Display(Name = "Apellidos")]
        public string last_name { get; set; }

        [Required(ErrorMessage = "El Telefono es requerido")]
        [Display(Name = "Telefono Celular Ej. 0426-1525689")]
        [RegularExpression(@"\(?(\d{4})\)?-?(\d{7})$", ErrorMessage = "El Teléfono Célular no es válido.")]
        public string phone { get; set; }

        [Display(Name = "Carrera(s) de Interes")]
        public string career { get; set; }

        [Display(Name = "Zona de Residencia")]
        public string zone { get; set; }

        [Display(Name = "Colegio al que perteneces")]
        public string school { get; set; }

        [Required(ErrorMessage = "El nombre  es requerido")]
        [Display(Name = "Nombres")]
        public string parent_name { get; set; }

        [Required(ErrorMessage = "El apellido es requerido")]
        [Display(Name = "Apellidos")]
        public string parent_last_name { get; set; }

        [Required(ErrorMessage = "El Número de Cédula es requerido")]
        [Display(Name = "Número de Cédula Ej.5914589")]
        [RegularExpression(@"^[0-9]*$", ErrorMessage = "La cédula debe ser Númerica.")]
        [StringLength(8, ErrorMessage = "La cédula debe ser de 7 o 8 de largo .", MinimumLength = 7)]
        public string parent_cedula { get; set; }

        [Required(ErrorMessage = "El Telefono  es requerido")]
        [Display(Name = "Telefono Celular Ej. 0426-1525689")]
        [RegularExpression(@"\(?(\d{4})\)?-?(\d{7})$", ErrorMessage = "El Teléfono Célular no es válido.")]
        public string parent_phone { get; set; }

        [Required(ErrorMessage = "El correo es requerido")]
        [DataType(DataType.EmailAddress)]
        [Display(Name = "Correo Electrónico")]
        [RegularExpression(@"^(([\w-]+\.)+[\w-]+|([a-zA-Z]{1}|[\w-]{2,}))@((([0-1]?[0-9]{1,2}|25[0-5]|2[0-4][0-9])\.([0-1]?[0-9]{1,2}|25[0-5]|2[0-4][0-9])\.([0-1]?[0-9]{1,2}|25[0-5]|2[0-4][0-9])\.([0-1]?[0-9]{1,2}|25[0-5]|2[0-4][0-9])){1}|([a-zA-Z]+[\w-]+\.)+[a-zA-Z]{2,4})$", ErrorMessage = "No es un email válido.")]
        public string parent_email { get; set; }

        [Display(Name = "Turno de Curso")]
        public int idTurno { get; set; }

        [Display(Name = "Sede de Curso")]
        public int idSede { get; set; }

        [Display(Name = "Status")]
        public int idStatus { get; set; } // Pendiente = 1, Aprobado = 2, Bloqueado = 3, Rechazado=4

        [Display(Name = "Preferencia Academica")]
        public string idRol { get; set; }

        [Display(Name = "Modo de Pago de Curso")]
        public int idModoPago { get; set; }

        [Display(Name = "Número de Cuotas Pagadas")]
        public int n_cuotas_pago { get; set; }

        [Display(Name = "Forma de Pago de Curso")]
        public int idFormaPago { get; set; }

        [Required(ErrorMessage = "El número de transacción es requerida")]
        [Display(Name = "Número Transacción")]
        public string n_transaction { get; set; }
        
        [Display(Name = "Fecha Carga")]
        [DataType(DataType.Date)]
        public DateTime? transactionDate { get; set; }

        [Display(Name = "Aprobado?")]
        public string verificado { get; set; }

        [Display(Name = "Forma de Pago de Curso (2da Cuota)")]
        public int idFormaPago02 { get; set; }

        [Display(Name = "Número Transacción (2da Cuota)")]
        public string n_transaction02 { get; set; }

        [Display(Name = "Fecha Carga (2da Cuota)")]
        [DataType(DataType.Date)]
        public DateTime? transactionDate02 { get; set; }

        [Display(Name = "Aprobado? (2da Cuota)")]
        public string verificado02 { get; set; }

        [Display(Name = "Forma de Pago de Curso (3era Cuota)")]
        public int idFormaPago03 { get; set; }

        [Display(Name = "Número Transacción (3era Cuota)")]
        public string n_transaction03 { get; set; }

        [Display(Name = "Fecha Carga (3era Cuota)")]
        [DataType(DataType.Date)]
        public DateTime? transactionDate03 { get; set; }

        [Display(Name = "Aprobado? (3era Cuota)")]
        public string verificado03 { get; set; }

        [Display(Name = "Nombre y Apellido Alumno")]
        public string recomendado { get; set; }

        public virtual Turno nTurno { get; set; }

        public virtual Sede nSede { get; set; }

        public virtual ModoPago nModoPago { get; set; }

        public virtual Status nStatus { get; set; }

        public virtual Rol nRol { get; set; }

        public virtual FormaPago nFormaPago { get; set; }

        public virtual FormaPago02 nFormaPago02 { get; set; }

        public virtual FormaPago03 nFormaPago03 { get; set; }

        public virtual ICollection<Post_CYT> Post_CYT { get; set; }

        public virtual ICollection<Problemario_User_I> Problemario_User_I { get; set; }
    }

    public class Turno
    {
        [Key]
        public int idTurno { get; set; }

        [Required(ErrorMessage = "El Turno es requerido")]
        [Display(Name = "Turno")]
        public string name { get; set; }

        public virtual ICollection<User_I> User_I { get; set; }

    }

    public class Sede
    {
        [Key]
        public int idSede { get; set; }

        [Required(ErrorMessage = "La Sede es requerida")]
        [Display(Name = "Sede")]
        public string name { get; set; }

        public virtual ICollection<User_I> User_I { get; set; }

    }

    public class ModoPago
    {
        [Key]
        public int idModoPago { get; set; }

        [Required(ErrorMessage = "El Modo de Pago es requerido")]
        [Display(Name = "Modo Pago")]
        public string name { get; set; }

        [Required(ErrorMessage = "El Número de Cuotas es requerido")]
        public int n_cuotas { get; set; }

        [Display(Name = "Fecha Expiración 2da Cuota")]
        [DataType(DataType.Date)]
        public DateTime? exp_date02 { get; set; }
        //IdModoPago = 1 --> exp_date02 = NULL
        //IdModoPago = 2 --> exp_date02 = 01/11/2014 (Noviembre)
        //IdModoPago = 3 --> exp_date02 = 01/11/2014 (Noviembre)

        [Display(Name = "Fecha Expiración 3era Cuota")]
        [DataType(DataType.Date)]
        public DateTime? exp_date03 { get; set; }
        //IdModoPago = 1 --> exp_date03 = NULL
        //IdModoPago = 2 --> exp_date03 = NULL
        //IdModoPago = 3 --> exp_date03 = 01/12/2014 (Diciembre)

        public virtual ICollection<User_I> User_I { get; set; }

    }

    public class Status
    {
        [Key]
        public int idStatus { get; set; } 
        //IdStatus = 1 Pendiente: El Usuario puede Ingresar al Sistema y utulizar todas las funcionailadades si ya fue aprobada la 1era Cuota.
        //                     >> Estado que se genera al 1.- Registrarse, 2.- Pagar Cuota y 3.- Edit.
        //                     >> Bloqueo Usuario: NO.
        //IdStatus = 2 Aprobado:  El Usuario puede Ingresar al Sistema y utilizar todas las funcionalidades.
        //                     >> Estado que se genera al 1.- Aprobar Cuota y 2.- Edit.
        //                     >> Bloqueo Usuario: NO.
        //IdStatus = 3 Bloqueado: El Usuario NO puede Ingresar al Sistema. 
        //                     >> Estado que se genera al 1.- Edit.
        //                     >> Bloqueo Usuario: SI.
        //idStatus = 4 Rechazado: El Usuario puede Ingresar al Sistema y pero SOLO utilizar la funcionalidad de Cuotas Pago.
        //                     >> Estado que se genera al 1.- Denegar Cuota y 2.- Funcionalidad de Bloqueo Automatico (Vencimiento Cuotas).
        //                     >> Bloqueo Usuario: NO.

        [Required(ErrorMessage = "El Status es requerido")]
        [Display(Name = "Status")]
        public string name { get; set; }

        public virtual ICollection<User_I> User_I { get; set; }

        public virtual ICollection<Post_CYT> Post_CYT { get; set; }

    }

    public class Rol
    {
        [Key]
        public string idRol { get; set; }
        //IdRol = Guest_C: Ciencias de la Salud.
        //IdRol = Guest_H: Humanidades y Sociales.
        //IdRol = Guest_I: Ingeniería y Ciencias Básicas.
        //**** Guest_FAIL: Rol a Nivel de ASP.NET Membership para Bloquear Acceso a Funcinalidades del Sistema.

        [Required(ErrorMessage = "El Rol es requerido")]
        [Display(Name = "Rol")]
        public string name { get; set; }

        public virtual ICollection<User_I> User_I { get; set; }

    }

    public class FormaPago
    {
        [Key]
        public int idFormaPago { get; set; }

        [Required(ErrorMessage = "La Forma de Pago es requerida")]
        [Display(Name = "Forma de Pago")]
        public string name { get; set; }

        public virtual ICollection<User_I> User_I { get; set; }
    }

    public class FormaPago02
    {
        [Key]
        public int idFormaPago02 { get; set; }

        [Required(ErrorMessage = "La Forma de Pago es requerida")]
        [Display(Name = "Forma de Pago (2da Cuota)")]
        public string name { get; set; }

        public virtual ICollection<User_I> User_I { get; set; }
    }

    public class FormaPago03
    {
        [Key]
        public int idFormaPago03 { get; set; }

        [Required(ErrorMessage = "La Forma de Pago es requerida")]
        [Display(Name = "Forma de Pago (3era Cuota)")]
        public string name { get; set; }

        public virtual ICollection<User_I> User_I { get; set; }
    }

    public class Mail
    {
        [Key]
        public int id { get; set; } /***** id = 1  --> Correos de los Administradores separados por ',' *****/

        [Required(ErrorMessage = "El Correo es Requerido")]
        [Display(Name = "Correo Admin, para varios Correos ingreselos separados por ',' . Ej. 123@hot.com,456@hot.com")]
        public string name { get; set; }
    }

    public class Post_CYT
    {
        [Key]
        public int id { get; set; }

        [Required(ErrorMessage = "El Asunto es Requerido (35 Caracteres)")]
        [Display(Name = "Asunto")]
        [StringLength(35, ErrorMessage = "Asunto debe de ser de 35 Caracteres de largo .", MinimumLength = 1)]
        public string asunto { get; set; }

        [Required(ErrorMessage = "El Mensaje es Requerido")]
        [Display(Name = "Mensaje Consulta (300 Caracteres)")]
        public string textoGuest { get; set; }

        [Display(Name = "Fecha Consulta")]
        [DataType(DataType.Date)]
        public DateTime? dateGuest { get; set; }

        [Display(Name = "Usuario Administrador")]
        public string userAdmin { get; set; }

        [Display(Name = "Mensaje Respuesta")]
        public string textoAdmin { get; set; }

        [Display(Name = "Fecha Respuesta")]
        [DataType(DataType.Date)]
        public DateTime? dateAdmin { get; set; }

        [Display(Name = "Status")]
        public int idStatus { get; set; } // Pendiente = 1, Aprobado = 2

        [Display(Name = "Usuario Remitente")]
        public string userName { get; set; }

        public virtual Status nStatus { get; set; }

        public virtual User_I nUser_I { get; set; }

    }



    /************************************************************************************************************/
    /**********************          DECLARACIÓN DEL MODELO CRECE Y TRIUNFA MÓDULO 3        *********************/
    /************************************************************************************************************/
    /*** Tablas:                                                                                              ***/
    /***        Problemario.dbo                                                                               ***/
    /***        Problemario_User_I.dbo                                                                        ***/
    /***        Pregunta.dbo                                                                                  ***/
    /***        Respuesta.dbo                                                                                 ***/
    /***        Estado.dbo                                                                                    ***/
    /***        Etapa.dbo                                                                                     ***/
    /***        Materia_1.dbo                                                                                 ***/
    /***        Materia_2.dbo                                                                                 ***/
    /***        Materia_3.dbo                                                                                 ***/
    /***                                                                                                      ***/
    /************************************************************************************************************/
    /************************************************************************************************************/

    public class Problemario
    {
        [Key]
        public int idPU { get; set; }

        [Display(Name = "Etapa")]
        public int idEtapa { get; set; }

        [Required(ErrorMessage = "La Jornada es Requerida")]
        [Display(Name = "Jornada")]
        public int idJornada { get; set; }

        [Display(Name = "Rol")]
        public string idRol { get; set; }

        [Display(Name = "id Status")]
        public int idEstado { get; set; }

        [Display(Name = "Materia 1")]
        public int idMateria_1 { get; set; }

        [Display(Name = "Materia 2")]
        public int idMateria_2 { get; set; }

        [Display(Name = "Materia 3")]
        public int idMateria_3 { get; set; }

        [Required(ErrorMessage = "Fechaa de Expiración es Requerida")]
        [Display(Name = "Fecha Expiración")]
        [DataType(DataType.Date)]
        [DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}", ApplyFormatInEditMode = true)]
        public DateTime? fecha_exp { get; set; }

        [Required(ErrorMessage = "El Archivo es Requerido")]
        [Display(Name = "Nombre Archivo")]
        public string file_name { get; set; }

        public virtual Etapa nEtapa { get; set; }

        public virtual Estado nEstado { get; set; }

        public virtual Materia_1 nMateria_1 { get; set; }

        public virtual Materia_2 nMateria_2 { get; set; }

        public virtual Materia_3 nMateria_3 { get; set; }

        public virtual ICollection<Problemario_User_I> Problemario_User_I { get; set; }
    }

    public class Problemario_User_I
    {
        [Key]
        public int idP { get; set; }

        public int idPU { get; set; }

        public string UserName { get; set; }
        
        [Display(Name = "Nota Materia 1")]
        public int nota_1 { get; set; }

        [Display(Name = "Nota Materia 2")]
        public int nota_2 { get; set; }

        [Display(Name = "Nota Materia 3")]
        public int nota_3 { get; set; }

        [Display(Name = "Nota Materia Prom")]
        public int nota_p { get; set; }

        [Required(ErrorMessage = "Fecha de Respuesta es Requerida")]
        [Display(Name = "Fecha Respuesta")]
        [DataType(DataType.Date)]
        public DateTime? fecha_resp { get; set; }

        public virtual Problemario nProblemario { get; set; }

        public virtual User_I nUser_I { get; set; }
    }

    public class Pregunta
    {
        [Key]
        public int idPR { get; set; }

        public int idPU { get; set; }

        [Display(Name = "Materia 1")]
        public int idMateria_1 { get; set; }

        [Display(Name = "Pregunta Materia 1")]
        public int Pregunta_1 { get; set; }

        [Display(Name = "Respuesta Materia 1")]
        public string Respuesta_1 { get; set; }

        [Display(Name = "Materia 2")]
        public int idMateria_2 { get; set; }

        [Display(Name = "Pregunta Materia 2")]
        public int Pregunta_2 { get; set; }

        [Display(Name = "Respuesta Materia 2")]
        public string Respuesta_2 { get; set; }

        [Display(Name = "Materia 3")]
        public int idMateria_3 { get; set; }

        [Display(Name = "Pregunta Materia 3")]
        public int Pregunta_3 { get; set; }

        [Display(Name = "Respuesta Materia 3")]
        public string Respuesta_3 { get; set; }

        public virtual Materia_1 nMateria_1 { get; set; }

        public virtual Materia_2 nMateria_2 { get; set; }

        public virtual Materia_3 nMateria_3 { get; set; }
    }

    public class Respuesta
    {
        [Key]
        public int idR { get; set; }

        public int idPR { get; set; }

        public string UserName { get; set; }    

        [Display(Name = "Materia 1 User")]
        public int idMateria_1 { get; set; }

        [Display(Name = "Pregunta Materia 1 User")]
        public int Pregunta_1 { get; set; }

        [Display(Name = "Respuesta Materia 1 User")]
        public string Respuesta_1 { get; set; }

        [Display(Name = "Materia 2 User")]
        public int idMateria_2 { get; set; }

        [Display(Name = "Pregunta Materia 2 User")]
        public int Pregunta_2 { get; set; }

        [Display(Name = "Respuesta Materia 2 User")]
        public string Respuesta_2 { get; set; }

        [Display(Name = "Materia 3 User")]
        public int idMateria_3 { get; set; }

        [Display(Name = "Pregunta Materia 3 User")]
        public int Pregunta_3 { get; set; }

        [Display(Name = "Respuesta Materia 3 User")]
        public string Respuesta_3 { get; set; }

        public virtual Materia_1 nMateria_1 { get; set; }

        public virtual Materia_2 nMateria_2 { get; set; }

        public virtual Materia_3 nMateria_3 { get; set; }
    }

    public class Estado
    {
        [Key]
        public int idEstado { get; set; }

        [Required(ErrorMessage = "El Estado es Requerido")]
        [Display(Name = "Estado")]
        public string name { get; set; }
    }

    public class Etapa
    {
        [Key]
        public int idEtapa { get; set; }

        [Required(ErrorMessage = "La Etapa es Requerida")]
        [Display(Name = "Etapa")]
        public string name { get; set; }

        public virtual ICollection<Problemario> Problemario { get; set; }
    }

    public class Materia_1
    {
        [Key]
        public int idMateria_1 { get; set; }

        [Required(ErrorMessage = "La Materia es Requerida")]
        [Display(Name = "Materia 1")]
        public string name { get; set; }

        public virtual ICollection<Problemario> Problemario { get; set; }
        public virtual ICollection<Pregunta> Pregunta { get; set; }
        public virtual ICollection<Respuesta> Respuesta { get; set; }
    }

    public class Materia_2
    {
        [Key]
        public int idMateria_2 { get; set; }

        [Required(ErrorMessage = "La Materia es Requerida")]
        [Display(Name = "Materia 2")]
        public string name { get; set; }

        public virtual ICollection<Problemario> Problemario { get; set; }
        public virtual ICollection<Pregunta> Pregunta { get; set; }
        public virtual ICollection<Respuesta> Respuesta { get; set; }
    }

    public class Materia_3
    {
        [Key]
        public int idMateria_3 { get; set; }

        [Required(ErrorMessage = "La Materia es Requerida")]
        [Display(Name = "Materia 3")]
        public string name { get; set; }

        public virtual ICollection<Problemario> Problemario { get; set; }
        public virtual ICollection<Pregunta> Pregunta { get; set; }
        public virtual ICollection<Respuesta> Respuesta { get; set; }
    }

}
